package com.linyaonan.leetcode.easy._2908;

/**
 *
 * 给你一个下标从 0 开始的整数数组 nums 。
 *
 * 如果下标三元组 (i, j, k) 满足下述全部条件，则认为它是一个 山形三元组 ：
 *
 * i < j < k
 * nums[i] < nums[j] 且 nums[k] < nums[j]
 * 请你找出 nums 中 元素和最小 的山形三元组，并返回其 元素和 。如果不存在满足条件的三元组，返回 -1 。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums = [8,6,1,5,3]
 * 输出：9
 * 解释：三元组 (2, 3, 4) 是一个元素和等于 9 的山形三元组，因为：
 * - 2 < 3 < 4
 * - nums[2] < nums[3] 且 nums[4] < nums[3]
 * 这个三元组的元素和等于 nums[2] + nums[3] + nums[4] = 9 。可以证明不存在元素和小于 9 的山形三元组。
 * 示例 2：
 *
 * 输入：nums = [5,4,8,7,10,2]
 * 输出：13
 * 解释：三元组 (1, 3, 5) 是一个元素和等于 13 的山形三元组，因为：
 * - 1 < 3 < 5
 * - nums[1] < nums[3] 且 nums[5] < nums[3]
 * 这个三元组的元素和等于 nums[1] + nums[3] + nums[5] = 13 。可以证明不存在元素和小于 13 的山形三元组。
 * 示例 3：
 *
 * 输入：nums = [6,5,4,3,4,5]
 * 输出：-1
 * 解释：可以证明 nums 中不存在山形三元组。
 *
 *
 * 提示：
 *
 * 3 <= nums.length <= 50
 * 1 <= nums[i] <= 50
 *
 * @author: Lin
 * @date: 2024/3/29
 */
public class MinimumSumOfMountainTripletsI {

    public int minimumSum(int[] nums) {
        // 从左侧向右找比最小值
        int[] l = new int[nums.length];
        int lMin = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {
            lMin = Math.min(nums[i], lMin);
            l[i] = lMin;
        }

        // 从右侧向左找最小值
        int[] r = new int[nums.length];
        int rMin = Integer.MAX_VALUE;
        for (int i = nums.length - 1; i >= 0; i--) {
            rMin = Math.min(nums[i], rMin);
            r[i] = rMin;
        }

        int result = Integer.MAX_VALUE;
        boolean get = false;
        for (int i = 1; i < nums.length - 1; i++) {
            if (nums[i] > l[i - 1] && nums[i] > r[i + 1]) {
                get = true;
                result = Math.min(nums[i] + l[i - 1] + r[i + 1], result);
            }
        }

        if (!get) {
            return -1;
        } else {
            return result;
        }

    }

}
